home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / util / pack / xpk_Source.lha / xpk_Source / shell / xDir.c < prev    next >
C/C++ Source or Header  |  1996-12-06  |  4KB  |  217 lines

  1. #define NAME     "xDir"
  2. #define REVISION "2"
  3.  
  4. /* Programmheader
  5.  
  6.     Name:        xDir
  7.     Author:        SDI (before 1.2 Urban Dominik Müller)
  8.     Distribution:    PD
  9.     Description:    xpk file lister
  10.     Compileropts:    -
  11.     Linkeropts:    -l xpkmaster
  12.  
  13.  1.2   29.11.96 : reworked for new includes
  14. */
  15.  
  16. #include <stdlib.h>
  17. #include "SDI_defines.h"
  18. #define SDI_TO_ANSI
  19. #include "SDI_ASM_STD_protos.h"
  20. #include <pragma/exec_lib.h>
  21. #include <pragma/dos_lib.h>
  22. #include <pragma/xpkmaster_lib.h>
  23.  
  24. #ifdef __MAXON__
  25.   #define __asm
  26. #endif
  27.  
  28. struct Library *XpkBase = 0;
  29.  
  30. #define MAXLINES 2000
  31.  
  32. UBYTE errbuf[XPKERRMSGSIZE + 1], *Line[MAXLINES];
  33. struct FileInfoBlock *Fib;
  34. LONG utot, ctot, Lines;
  35. UBYTE buf[300];
  36.  
  37. void exitem(STRPTR name);
  38. void exfile(struct FileInfoBlock *fib);
  39. void print(STRPTR str);
  40. void showlines(void);
  41.  
  42. void end(STRPTR text)
  43. {
  44.   if(text)    print(text);
  45.   if(XpkBase)    CloseLibrary(XpkBase);
  46.   exit(text ? 10 : 0);
  47. }
  48.  
  49. UBYTE usage[]= "Usage: xDir files/dirs\n";
  50.  
  51. void main(int argc, char *argv[])
  52. {
  53.   LONG i, ratio = 0;
  54.  
  55.   if(argc == 2 && !stricmp (argv[1], "?"))
  56.     end(usage);
  57.  
  58.   if(!(XpkBase = OpenLibrary(XPKNAME, 0)))
  59.     end("Cannot open " XPKNAME "\n");
  60.  
  61.   if(argc < 2)
  62.     argv[1] = "", argc = 2;
  63.  
  64.   if(!(Fib = (struct FileInfoBlock *) AllocMem (sizeof(struct FileInfoBlock *), 0)))
  65.     end("Not enough memory\n");
  66.  
  67.   if(*argv[1] == '-')
  68.     end (usage);
  69.  
  70.   print("Original  Packed  Ratio Type Protection Name\n");
  71.   print("-------- -------- ----- ---- ---------- ----\n");
  72.   for(i = 1; i < argc; i++)
  73.     exitem(argv[i]);
  74.  
  75.   showlines();
  76.  
  77.   if(utot)
  78.     ratio = 100 - 100 * ctot / utot;
  79.   print("-------- -------- -----\n");
  80.   sprintf(buf, "%8ld %8ld  %2ld%%\n", utot, ctot, ratio);
  81.   print(buf);
  82.  
  83.   end(NULL);
  84. }
  85.  
  86. void showlines(void)
  87. {
  88.   LONG i;
  89.  
  90.   for(i = 0; i < Lines; i++)
  91.   {
  92.     Write(Output(), Line[i], strlen(Line[i]));
  93.     if(SetSignal (0, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
  94.       end(" *** Break\n");
  95.   }
  96.   Lines = 0;
  97. }
  98.  
  99. void print(STRPTR str)
  100. {
  101.   Write(Output(), str, strlen (str));
  102. }
  103.  
  104. STRPTR dirname(STRPTR rp)
  105. {
  106.   static UBYTE dir[200];
  107.   STRPTR wp = dir, lp = dir;
  108.  
  109.   while(*rp)
  110.   {
  111.     if(*rp == ':')
  112.       lp = wp + 1;
  113.     if(*rp == '/')
  114.       lp = wp;
  115.     *wp++ = *rp++;
  116.   }
  117.   *lp = 0;
  118.   return dir;
  119. }
  120.  
  121. void exitem(STRPTR name)
  122. {
  123.   BPTR lock, prev;
  124.  
  125.   if(!(lock = Lock (name, ACCESS_READ)))
  126.   {
  127.     sprintf(buf, "Error %ld reading %s\n", IoErr(), name);
  128.     print(buf);
  129.     return;
  130.   }
  131.  
  132.   if(!Examine (lock, Fib))
  133.   {
  134.     UnLock(lock);
  135.     sprintf(buf, "Error %ld reading %s\n", IoErr(), name);
  136.     print(buf);
  137.     return;
  138.   }
  139.  
  140.   if(Fib->fib_DirEntryType < 0)
  141.   {
  142.     UnLock(lock);
  143.     if(!(lock = Lock (dirname (name), ACCESS_READ)))
  144.     {
  145.       sprintf (buf, "Error locking %s\n", name);
  146.       print (buf);
  147.       return;
  148.     }
  149.  
  150.     prev = CurrentDir(lock);
  151.     exfile(Fib);
  152.     UnLock(CurrentDir(prev));
  153.   }
  154.   else
  155.   {
  156.     prev = CurrentDir (lock);
  157.  
  158.     if(Lines)
  159.     {
  160.       showlines();
  161.       print("\n");
  162.     }
  163.  
  164.     while(ExNext (lock, Fib))
  165.       exfile(Fib);
  166.     UnLock(CurrentDir (prev));
  167.   }
  168. }
  169.  
  170. void exfile(struct FileInfoBlock *fib)
  171. {
  172.   struct XpkFib xfib;
  173.   UBYTE prot[10];
  174.   LONG i, clen = 0, ulen = 0;
  175.   UBYTE buf[200];
  176.  
  177.   if(SetSignal (0, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
  178.     end(" *** Break\n");
  179.  
  180.   prot[0] = fib->fib_DirEntryType < 0 ? '-' : 'd';
  181.   for(i = 0; i < 8; i++)
  182.     prot[8 - i] = (Fib->fib_Protection ^ 0x0f) & (1 << i) ? "dewrapsh"[i] : '-';
  183.   prot[9] = 0;
  184.  
  185.   if(XpkExamineTags(&xfib,
  186.             XPK_InName, fib->fib_FileName,
  187.             TAG_DONE) || xfib.xf_Type != XPKTYPE_PACKED)
  188.   {
  189.     if(fib->fib_EntryType < 0)
  190.       sprintf(buf, "%8ld                      %9s %-20s\n",
  191.            clen = ulen = fib->fib_Size, prot,
  192.            fib->fib_FileName);
  193.     else
  194.       sprintf(buf, "%8s                      %9s %-20s\n",
  195.            "<Dir>", prot,
  196.            fib->fib_FileName);
  197.   }
  198.   else
  199.     sprintf (buf, "%8ld %8ld  %2ld%%  %4s  %9s %-20s\n",
  200.          ulen = xfib.xf_ULen,
  201.          clen = xfib.xf_CLen,
  202.          xfib.xf_Ratio,
  203.          xfib.xf_Packer,
  204.          prot,
  205.          fib->fib_FileName);
  206.  
  207.   for (i = Lines - 1; i >= 0 && stricmp (Line[i] + 40, buf + 40) > 0; i--)
  208.     Line[i + 1] = Line[i];
  209.   Line[i + 1] = strcpy((STRPTR) malloc(strlen(buf) + 1), buf);
  210.  
  211.   if(++Lines >= MAXLINES)
  212.     end ("Buffer overflow\n");
  213.  
  214.   utot += ulen;
  215.   ctot += clen;
  216. }
  217.